home *** CD-ROM | disk | FTP | other *** search
/ Aminet 44 / Aminet 44 (2001)(GTI - Schatztruhe)[!][Aug 2001].iso / Aminet / docs / lists / GHAS.lha / ghas / herbex / herbex.rexx next >
OS/2 REXX Batch file  |  2001-05-03  |  5KB  |  127 lines

  1. /*  Herbex.rexx */
  2. /*  ©May 2001 C.Dawson */
  3. /*  convert the herbs.txt database into a usable printable ascii form   */
  4. address command                                   /* talk to arexx */
  5.  
  6.  
  7.                                                   /* CHANGABLE ITEMS */
  8.  
  9. inname  = "ram:herbs.txt"                         /* input file */
  10. outname = "ram:HERBS.ASCII"                       /* output file */
  11. pwidth  = 80                                      /* desired page width BE CAREFULL */
  12. tlines  = 994                                     /* number of database records to convert */
  13. hdext   = "_"                                     /* the fill char for headings */
  14.  
  15.                                                   /* END CHANGABLE ITEMS */
  16.  
  17.  
  18. spacer  = ": "
  19. tab0    = copies(" ",17)||spacer
  20. tab1    = copies(hdext,17)||spacer
  21. cr      = "0a"x
  22.  
  23.  
  24. fwidth  = pwidth - 19                             /* page width minus length of header name */
  25.  
  26. h0 =  "Name"||copies(hdext,13)||spacer            /* all the header names */
  27. h1 =  "Botanical Name"||copies(hdext,3)||spacer
  28. h2 =  "Systems Affected"||copies(hdext,1)||spacer
  29. h3 =  "Properties"||copies(hdext,7)||spacer
  30. h4 =  "Description"||copies(hdext,6)||spacer
  31. h5 =  "Origin"||copies(hdext,11)||spacer
  32. h6 =  "Notes"||copies(hdext,12)||spacer
  33. h7 =  "Toxicity"||copies(hdext,9)||spacer
  34. h8 =  "Dosage"||copies(hdext,11)||spacer
  35. h9 =  "Type"||copies(hdext,13)||spacer
  36.  
  37. call open(infile,inname,'r')                      /* open main data input file (read mode)*/
  38. call open(outfile,outname,'w')                    /* open main data output file (write mode)*/
  39.  
  40. do loop = 1 to tlines                             /*tlines = do all lines of database file */
  41.  
  42.  say "Reading line #" loop
  43.  data = readln(infile)                            /* read in a line of data */
  44.  
  45.  data = translate(data," ","¤")                   /* replace any '¤' with a space */
  46.  
  47.  f0 = h0||strip(substr(data,1,36),B,)||cr         /* get each field of 1 data line */
  48.  f1 = h1||strip(substr(data,37,60),B,)||cr        /* strip all trailing spaces and */
  49.  f2 = h2||strip(substr(data,98,50),B,)||cr        /* add a carridge return */
  50.  f3 = h3||strip(substr(data,149,500),B,)||cr      /* this is the BIG string */
  51.  f4 = h4||strip(substr(data,650,40),B,)||cr
  52.  f5 = h5||strip(substr(data,691,30),B,)||cr
  53.  f6 = h6||strip(substr(data,722,55),B,)||cr       /* perhaps a loop would be more elegant */
  54.  f7 = h7||strip(substr(data,778,40),B,)||cr
  55.  f8 = h8||strip(substr(data,819,50),B,)||cr
  56.  f9 = h9||strip(substr(data,870,15),B,)||cr
  57.  
  58.  if length(f3) > pwidth then                      /* check if 'properties' needs to be wrapped */
  59.   do                                              /* this is the ONLY field LONGER than 80 chars */
  60.     wrapstr = f3
  61.     call linewrap wrapstr
  62.     f3 = wrapstr
  63.   end
  64.  
  65.  outstr = f0||f1||f2||f3||f4||f5||f6||f7||f8||f9  /* put it all together */
  66.  
  67.  say "Writing Record #" loop
  68.  call writeln(outfile,outstr)                     /* save 1 full herb entry to new file */
  69.  
  70. end
  71.  
  72. call close(outfile)                               /* close main data out file */
  73. call close(infile)                                /* close main data in file */
  74.  
  75. exit                                              /* end of this rubbish */
  76.  
  77. /*================================================*/
  78.  
  79. linewrap:                                         /* linewrap routine */
  80.  
  81. say "***** Ajusting line *****"
  82.  
  83. temp        = wrapstr                             /* set all the linewrap variables */
  84. newstr      = ""
  85. workstr     = ""
  86. wloop       = 1
  87. instr       = cr||tab0                            /* a big tab */
  88. linstr      = length(instr)                       /* length of tab */
  89. numchars    = length(wrapstr)                     /* count chars in string to wrap */
  90. numwords    = words(wrapstr)                      /* count chars in string to wrap */
  91.  
  92. do until wloop >= numwords                        /* check all words in long string */
  93.  
  94. wordlen = wordlength(temp,wloop)
  95. templen = length(newstr) + wordlen
  96. charpos = wordindex(temp,wloop + 1)
  97. charsleft = numchars - charpos
  98.  
  99. if templen >  pwidth then                         /* if this word won't fit then new line */
  100.  do
  101.   workstr = workstr || newstr                     /* save the string so far and then... */
  102.   newstr = instr                                  /* add a cr plus tab for next line */
  103.  end
  104.  
  105. if templen <= pwidth then                         /* check if we can add this word */
  106.  do
  107.   newstr = newstr || word(temp,wloop) || " "      /* yes - add this word plus a space */
  108.   willitfit = length(newstr) + wordlength(temp,wloop+1)
  109.  
  110.   if willitfit >= pwidth then
  111.  
  112.    if charsleft + linstr <= pwidth then           /* will remainder of main string fit into */
  113.     do                                            /* 1 line */
  114.      workstr = workstr || newstr
  115.      workstr = workstr || instr
  116.      workstr = workstr || subword(temp,wloop+1,)
  117.      wloop = numwords
  118.     end
  119.   wloop = wloop + 1                               /* point to next word to check */
  120.  end
  121.  
  122. end
  123.  
  124. wrapstr = workstr
  125.  
  126. return
  127.